package com.shenda.device.analysis;

import java.io.Closeable;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.math.RoundingMode;
import java.text.DecimalFormat;

import com.swak.utils.IOUtils;
import com.swak.utils.StringUtils;

/**
 * 基础模板
 * 
 * @author lifeng
 */
public abstract class DataFileAnalysis extends BytesAnalysis implements Analysis, Closeable {

	/**
	 * 数据文件
	 */
	protected File datFile;
	protected String datFileName;
	protected File analysisFile;

	/**
	 * 需分析的文件
	 * 
	 * @param file
	 */
	public DataFileAnalysis(String file) {
		this(new File(file));
	}

	/**
	 * 需分析的文件
	 * 
	 * @param file
	 */
	public DataFileAnalysis(File file) {
		this.datFile = file;
		this.datFileName = StringUtils.substringBeforeLast(this.datFile.getName(), ".");
		this.analysisFile = new File(this.datFile.getParent(), this.datFileName + "_Analysis");
		if (!this.analysisFile.exists()) {
			this.analysisFile.mkdirs();
		}
	}

	/**
	 * 分析文件目录
	 * 
	 * @return
	 */
	public File getAnalysisFile() {
		return this.analysisFile;
	}

	/**
	 * 分文件名称
	 * 
	 * @param sn
	 * @return
	 */
	protected File getPartFileName(int sn) {
		return new File(this.analysisFile,
				this.datFileName + "." + StringUtils.leftPad(String.valueOf(sn), 5, "0") + ".all" + ".csv");
	}

	/**
	 * 分析文件
	 */
	@Override
	public AnalysisResult doAnalysis(AnalysisQuery query) {
		// 查找分析文件
		File[] csvs = this.analysisFile.listFiles((dir, name) -> {
			return name.endsWith(".csv");
		});

		// 如果分析文件为空 -- 执行分析
		if (csvs == null || csvs.length == 0) {
			FileInputStream inputStream = null;
			try {
				inputStream = new FileInputStream(datFile);
				this.doAnalysisData(inputStream);
			} catch (Exception e) {
				return None_Analysis.INSTANCE.doAnalysis(query);
			} finally {
				IOUtils.closeQuietly(inputStream);
				IOUtils.closeQuietly(this);
			}
		}

		// 读取分析数据
		return this.queryAnalysisResult(query);
	}

	/**
	 * 读取分析文件
	 * 
	 * @param query
	 * @return
	 */
	protected AnalysisResult queryAnalysisResult(AnalysisQuery query) {
		return query.fastAccess.doAccess(query.getStartFrame(), query.getEndFrame(), query.getStep(), query.getSkip());
	}

	/**
	 * 打开文件
	 * 
	 * @param file
	 * @return
	 */
	protected FileOutputStream open(File file) {
		try {
			if (!file.exists()) {
				file.createNewFile();
			}
			return new FileOutputStream(file);
		} catch (Exception e) {
			throw new RuntimeException(e);
		}
	}

	/**
	 * 得到数据格式化
	 * 
	 * @return
	 */
	protected DecimalFormat getDecimalFormat() {
		DecimalFormat decimalFormat = new DecimalFormat("0.000000");
		decimalFormat.setRoundingMode(RoundingMode.HALF_UP);
		return decimalFormat;
	}
}